<body>

<h1>对象的 CRUD 操作</h1>

<p>如果已知主键的值，那么可以使用这些方法进行 CRUD 操作</p>

<p>对 object 操作的四个方法 Read / Insert / Update / Delete</p>

<pre lang="go"><code>o := orm.NewOrm()
user := new(User)
user.Name = &quot;slene&quot;

fmt.Println(o.Insert(user))

user.Name = &quot;Your&quot;
fmt.Println(o.Update(user))
fmt.Println(o.Read(user))
fmt.Println(o.Delete(user))
</code></pre>

<p>如果需要通过条件查询获取对象，请参见<a href="query.md#all">高级查询</a></p>

<h2>Read</h2>

<pre lang="go"><code>o := orm.NewOrm()
user := User{Id: 1}

err := o.Read(&amp;user)

if err == orm.ErrNoRows {
    fmt.Println(&quot;查询不到&quot;)
} else if err == orm.ErrMissPK {
    fmt.Println(&quot;找不到主键&quot;)
} else {
    fmt.Println(user.Id, user.Name)
}
</code></pre>

<p>Read 默认通过查询主键赋值，可以使用指定的字段进行查询：</p>

<pre lang="go"><code>user := User{Name: &quot;slene&quot;}
err = o.Read(&amp;user, &quot;Name&quot;)
...
</code></pre>

<p>对象的其他字段值将会是对应类型的默认值</p>

<p>复杂的单个对象查询参见 <a href="query.md#one">One</a></p>

<h2>ReadOrCreate</h2>

<p>尝试从数据库读取，不存在的话就创建一个</p>

<p>默认必须传入一个参数作为条件字段，同时也支持多个参数多个条件字段</p>

<pre lang="go"><code>o := orm.NewOrm()
user := User{Name: &quot;slene&quot;}
// 三个返回参数依次为：是否新创建的，对象 Id 值，错误
if created, id, err := o.ReadOrCreate(&amp;user, &quot;Name&quot;); err == nil {
    if created {
        fmt.Println(&quot;New Insert an object. Id:&quot;, id)
    } else {
        fmt.Println(&quot;Get an object. Id:&quot;, id)
    }
}
</code></pre>

<h2>Insert</h2>

<p>第一个返回值为自增健 Id 的值</p>

<pre lang="go"><code>o := orm.NewOrm()
var user User
user.Name = &quot;slene&quot;
user.IsActive = true

id, err := o.Insert(&amp;user)
if err == nil {
    fmt.Println(id)
}
</code></pre>

<p>创建后会自动对 auto 的 field 赋值</p>

<h2>InsertMulti</h2>

<p>同时插入多个对象</p>

<p>类似sql语句</p>

<pre><code>insert into table (name, age) values(&quot;slene&quot;, 28),(&quot;astaxie&quot;, 30),(&quot;unknown&quot;, 20)
</code></pre>

<p>第一个参数 bulk 为并列插入的数量，第二个为对象的slice</p>

<p>返回值为成功插入的数量</p>

<pre lang="go"><code>users := []User{
    {Name: &quot;slene&quot;},
    {Name: &quot;astaxie&quot;},
    {Name: &quot;unknown&quot;},
    ...
}
successNums, err := o.InsertMulti(100, users)
</code></pre>

<p>bulk 为 1 时，将会顺序插入 slice 中的数据</p>

<h2>Update</h2>

<p>第一个返回值为影响的行数</p>

<pre lang="go"><code>o := orm.NewOrm()
user := User{Id: 1}
if o.Read(&amp;user) == nil {
    user.Name = &quot;MyName&quot;
    if num, err := o.Update(&amp;user); err == nil {
        fmt.Println(num)
    }
}
</code></pre>

<p>Update 默认更新所有的字段，可以更新指定的字段：</p>

<pre lang="go"><code>// 只更新 Name
o.Update(&amp;user, &quot;Name&quot;)
// 指定多个字段
// o.Update(&amp;user, &quot;Field1&quot;, &quot;Field2&quot;, ...)
...
</code></pre>

<p>根据复杂条件更新字段值参见 <a href="query.md#update">Update</a></p>

<h2>Delete</h2>

<p>第一个返回值为影响的行数</p>

<pre lang="go"><code>o := orm.NewOrm()
if num, err := o.Delete(&amp;User{Id: 1}); err == nil {
    fmt.Println(num)
}
</code></pre>

<p>Delete 操作会对反向关系进行操作，此例中 Post 拥有一个到 User 的外键。删除 User 的时候。如果 on_delete 设置为默认的级联操作，将删除对应的 Post</p>

<p><strong>Changed in 1.0.3</strong> 删除以后不会删除 auto field 的值</p>
